Skip to content

fix(claude): keep at-limit claude-swap cards complete - #3081

Merged
steipete merged 14 commits into
steipete:mainfrom
sf-jin-ku:feat/claude-swap-at-limit-card
Aug 20, 2026
Merged

fix(claude): keep at-limit claude-swap cards complete#3081
steipete merged 14 commits into
steipete:mainfrom
sf-jin-ku:feat/claude-swap-at-limit-card

Conversation

@sf-jin-ku

@sf-jin-ku sf-jin-ku commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Summary

  • When claude-swap defers polling because an account is at a 100% limit, cswap --list --json reports usageStatus: "unavailable" with usage: null. CodexBar previously dropped the snapshot and showed a red empty card: "Usage fetch failed."
  • Keep the 100% usage bars and name the exhausted window(s) plus reset time. The previous slot snapshot is current truth while polling is deferred, not "stale last successful update."

Final behavior

  • Project usage windows from a list row when status is .ok or .unavailable (defensive; current cswap 0.22.0 still sends usage: null with unavailable).
  • On a successful list refresh, if a slot is .unavailable with no windows, retain that slot's previous ProviderAccountUsageSnapshot.snapshot from UsageStore.claudeSwapAccountSnapshots, merged by claude-swap:<slot>, only when the email still matches.
  • CLI cards and dashboard load the same retained windows from a slot-keyed local cache that stores only rate windows (no emails or aliases). After a successful list, the cache is rewritten. Tests never read the live cache.
  • Bind those cached windows to a SHA-256 fingerprint of the slot account (email, or slot:N when there is no email). Replacing the account in that slot, or a legacy cache row with no discriminator, does not reuse the previous 100% bars.
  • Drop windows whose resetsAt is already in the past from both retained snapshots and directly attached unavailable usage objects. Keep remaining exhausted windows. If none are still exhausted, show "Polling deferred until a limit resets." instead of resurrecting expired 100% bars.
  • When retained/projected windows include a 100% window, the card note names it and the reset: "Session limit reached. Resets …" / "Weekly limit reached. Resets …" / scoped e.g. "Fable limit reached. Resets …" (all that apply). Reset phrasing reuses UsageFormatter.resetLine.
  • Other sentinels (token_expired, relogin_required, api_key, keychain_unavailable, no_credentials, unknown) are unchanged.
  • Menu and full CLI cards show bars and the at-limit note together (snapshot + note), not snapshot XOR error.
  • Identity remains claude-swap:<slot>. Email is display-only. No Keychain.

Verification

  • swift test --filter ClaudeSwapAccountProjectionTests --filter ClaudeProviderRuntimeTests — 25 passed, including staggered-reset cases (expired session + still-exhausted weekly; all-expired → deferred note). ClaudeProviderRuntimeTests uses Date()-relative reset timestamps.
  • After-fix live Claude Swap CLI (codexbar cards --provider claude --no-color from this branch), 2026-08-19. cswap --list --json schemaVersion 1, 2 accounts, both usageStatus: "ok" with usage present (the deferred unavailable path is not live on this machine right now). Cards render both slots with session/weekly bars and do not show "Usage fetch failed.":
╭─────────────────────────────────────╮  ╭─────────────────────────────────────╮
│ Claude [claude-swap]                │  │ Claude [claude-swap]                │
│ @ redacted@example.com [active]      │  │ @ redacted@example.com               │
│ ─────────────────────────────────── │  │ ─────────────────────────────────── │
│ Session                   100% left │  │ Session                    92% left │
│ Weekly                     96% left │  │ Weekly                     50% left │
╰─────────────────────────────────────╯  ╰─────────────────────────────────────╯
  • The expired-window filter is covered by fixtures rather than this live run, because neither live slot is currently unavailable with omitted windows.

Co-authored-by: Cursor <cursoragent@cursor.com>
@clawsweeper

clawsweeper Bot commented Aug 19, 2026

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

Co-authored-by: Cursor <cursoragent@cursor.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c1334b2704

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Project usage only for ok and unavailable slots, and retain a previous snapshot only when the email still matches and a 100% window has not reset.

Co-authored-by: Cursor <cursoragent@cursor.com>
@clawsweeper clawsweeper Bot added merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. P2 Normal priority bug or improvement with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Aug 19, 2026
@clawsweeper

clawsweeper Bot commented Aug 19, 2026

Copy link
Copy Markdown

Codex review: needs real behavior proof before merge. Reviewed August 20, 2026, 1:05 AM ET / 05:05 UTC.

ClawSweeper review

What this changes

The PR retains Claude Swap at-limit usage windows across deferred polling and renders the retained bars plus reset notes in the app, CLI cards, and dashboard.

Merge readiness

Blocked until stronger real behavior proof is added - 9 items remain

Keep open: current main still drops unavailable Claude Swap usage, but this branch needs real deferred-polling proof and resolution of two persistent-cache safety defects before merge.

Priority: P2
Reviewed head: b249e8755cc91d0bf0d801e6ece146b5b9c34918
Owner decision: Required. See Decision needed.

Review scores

Measure Result What it means
Overall readiness 🦪 silver shellfish (2/6) The behavioral direction and coverage are useful, but proof misses the repaired path and the persistent-cache identity contract has blocking P2 defects.
Proof confidence 🦪 silver shellfish (2/6) Needs stronger real behavior proof before merge: The PR includes a real terminal run, but it shows only normal ok rows; the unavailable/null-usage recovery is demonstrated only by fixtures, so add a redacted after-fix deferred-polling transcript or recording. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Patch quality 🦐 gold shrimp (3/6) Security review found an item that needs attention.

Verification

Check Result Evidence
Real behavior Needs proof Needs stronger real behavior proof before merge: The PR includes a real terminal run, but it shows only normal ok rows; the unavailable/null-usage recovery is demonstrated only by fixtures, so add a redacted after-fix deferred-polling transcript or recording. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
Evidence reviewed 5 items Current-main behavior remains unfixed: Current main only projects usage for an ok row and renders unavailable as “Usage fetch failed,” so the central reported behavior is not already implemented.
Persistent email-derived identifier: The new cache deterministically hashes slot plus normalized email and writes that value into the Application Support cache, despite the cache comments claiming identity is not persisted.
Same-email account collision: The cache discriminator contains only slot and email. The related open PR documents that Claude Swap accounts can share an email across organizations, so reusing a slot for another such account can retain the prior account’s limit windows.
Findings 2 actionable findings [P2] Avoid persisting an email-derived account fingerprint
[P2] Distinguish same-email accounts before reusing a slot cache
Security Needs attention Persisted email-derived identifier: The SHA-256 cache key is deterministic over the normalized account email and slot, allowing offline candidate matching from the cache file and exposing account correlation beyond the stated rate-window data.

How this fits together

Claude Swap list responses are projected into CodexBar account usage snapshots, which feed menu cards, terminal cards, and the dashboard. This PR adds a retained-window cache so an unavailable response can continue to show an exhausted rate-limit state.

flowchart LR
A[Claude Swap list response] --> B[Usage projection]
B --> C{Usage unavailable?}
C -->|no| D[Current account snapshot]
C -->|yes| E[Retained rate-window cache]
D --> F[Menu, CLI, and dashboard cards]
E --> F
Loading

Decision needed

Question Recommendation
Should CodexBar persist deferred Claude Swap windows across restarts when the only available discriminator is a deterministic derivative of the account email? Keep retention in memory only: Preserve correct at-limit cards during an app run and defer restart persistence until Claude Swap supplies a non-identifying opaque account key.

Why: The restart-survival feature requires a durable account binding, but the available binding is privacy-sensitive and still conflates organization accounts that share an email.

Before merge

  • Add real behavior proof - Needs stronger real behavior proof before merge: The PR includes a real terminal run, but it shows only normal ok rows; the unavailable/null-usage recovery is demonstrated only by fixtures, so add a redacted after-fix deferred-polling transcript or recording. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • Avoid persisting an email-derived account fingerprint (P2) - accountFingerprint is an unsalted deterministic SHA-256 of the account email and slot, then is written to Application Support. That is still a recoverable account correlator for candidate addresses and contradicts the cache’s no-identity claim; use a non-email opaque source identifier or do not persist the fallback.
  • Distinguish same-email accounts before reusing a slot cache (P2) - Late discovery: this code is unchanged since the prior reviewed head, but the related open PR at fix(claude): disambiguate claude-swap accounts that share an email #3082 establishes that distinct organizations can share an email. A slot reassigned between those accounts matches this slot + email key and can show the former account’s 100% windows; require an opaque account discriminator or decline disk retention.
  • Resolve security concern: Persisted email-derived identifier - The SHA-256 cache key is deterministic over the normalized account email and slot, allowing offline candidate matching from the cache file and exposing account correlation beyond the stated rate-window data.
  • Resolve merge risk (P1) - The persistent cache can show one organization’s exhausted usage for another same-email account when the numeric slot is reused.
  • Resolve merge risk (P1) - The Application Support cache stores an unsalted, guessable SHA-256 derivative of a display-only email.
  • Resolve merge risk (P1) - The submitted live terminal output exercises normal ok rows, not the unavailable/null-usage recovery path.
  • Complete next step (P2) - A maintainer must choose the acceptable privacy and restart-retention boundary; the contributor must also provide real deferred-polling proof before merge.

Findings

  • [P2] Avoid persisting an email-derived account fingerprint — Sources/CodexBarCore/Providers/Claude/ClaudeSwap/ClaudeSwapRetainedUsageStore.swift:49-53
  • [P2] Distinguish same-email accounts before reusing a slot cache — Sources/CodexBarCore/Providers/Claude/ClaudeSwap/ClaudeSwapRetainedUsageStore.swift:52-53
  • [medium] Persisted email-derived identifier — Sources/CodexBarCore/Providers/Claude/ClaudeSwap/ClaudeSwapRetainedUsageStore.swift:53
Agent review details

Security

Needs attention: The patch adds a persistent, deterministic email-derived identifier without a protected storage boundary.

Review metrics

Metric Value Why it matters
Implementation and test growth production +303/-21, tests +874/-7, docs +7/-2 A narrowly scoped deferred-polling fix adds a new persistent cache and substantial regression coverage, making the cache contract important to settle before merge.

Merge-risk options

Maintainer options:

  1. Use a safe account binding before persistence (recommended)
    Remove the email-derived disk discriminator and do not reuse restart-persistent windows until an opaque source identity can distinguish same-email organization accounts.
  2. Accept the cache tradeoff explicitly
    A maintainer may intentionally retain the disk cache, accepting that its email-derived key can correlate an account and can collide for same-email organizations.
  3. Keep only in-memory retention
    Land the nonpersistent portion if restart recovery is not worth expanding the account-identity storage boundary.

Technical review

Best possible solution:

Use a non-email, source-issued opaque account discriminator for any restart-persistent cache; otherwise keep retention in memory, add same-email replacement coverage, and provide a redacted after-fix unavailable-path transcript.

Do we have a high-confidence way to reproduce the issue?

Yes, from source: current main projects only ok rows and maps unavailable to an empty “Usage fetch failed” card; no live current-main run was performed.

Is this the best way to solve the issue?

No: retaining at-limit windows is appropriate, but a durable cache must not rely on an email-derived discriminator that can both leak correlation and collide for same-email organizations.

Full review comments:

  • [P2] Avoid persisting an email-derived account fingerprint — Sources/CodexBarCore/Providers/Claude/ClaudeSwap/ClaudeSwapRetainedUsageStore.swift:49-53
    accountFingerprint is an unsalted deterministic SHA-256 of the account email and slot, then is written to Application Support. That is still a recoverable account correlator for candidate addresses and contradicts the cache’s no-identity claim; use a non-email opaque source identifier or do not persist the fallback.
    Confidence: 0.98
  • [P2] Distinguish same-email accounts before reusing a slot cache — Sources/CodexBarCore/Providers/Claude/ClaudeSwap/ClaudeSwapRetainedUsageStore.swift:52-53
    Late discovery: this code is unchanged since the prior reviewed head, but the related open PR at fix(claude): disambiguate claude-swap accounts that share an email #3082 establishes that distinct organizations can share an email. A slot reassigned between those accounts matches this slot + email key and can show the former account’s 100% windows; require an opaque account discriminator or decline disk retention.
    Confidence: 0.93
    Late finding: first raised on code an earlier review cycle already covered.

Overall correctness: patch is incorrect
Overall confidence: 0.95

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 61f542253c65.

Labels

Label justifications:

  • P2: The PR fixes a limited provider-card failure but presently risks showing incorrect account usage and persists a privacy-sensitive identifier.
  • merge-risk: 🚨 compatibility: A same-slot, same-email organization replacement can inherit another account’s retained at-limit bars.
  • merge-risk: 🚨 security-boundary: The new Application Support cache persists a deterministic derivative of a display-only account email.
  • rating: 🦪 silver shellfish: Overall readiness is 🦪 silver shellfish; proof is 🦪 silver shellfish and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The PR includes a real terminal run, but it shows only normal ok rows; the unavailable/null-usage recovery is demonstrated only by fixtures, so add a redacted after-fix deferred-polling transcript or recording. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Evidence

Security concerns:

  • [medium] Persisted email-derived identifier — Sources/CodexBarCore/Providers/Claude/ClaudeSwap/ClaudeSwapRetainedUsageStore.swift:53
    The SHA-256 cache key is deterministic over the normalized account email and slot, allowing offline candidate matching from the cache file and exposing account correlation beyond the stated rate-window data.
    Confidence: 0.98

What I checked:

Likely related people:

  • steipete: Current-main blame assigns the projection baseline to Peter Steinberger, and he recently maintained Claude Swap menu behavior. (role: recent area contributor; confidence: high; commits: 66e032f0e7b9, 5a2a70458d95; files: Sources/CodexBarCore/Providers/Claude/ClaudeSwap/ClaudeSwapAccountProjection.swift, Sources/CodexBar/Providers/Claude/UsageStore+ClaudeSwapRefresh.swift)
  • optimiz-r: Introduced read-only Claude Swap accounts, the feature boundary this retention change extends. (role: feature introducer; confidence: high; commits: 88e8a537f266; files: Sources/CodexBarCore/Providers/Claude/ClaudeSwap/ClaudeSwapAccountProjection.swift)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Resolve the persistent cache discriminator and same-email organization collision.
  • Post redacted terminal or runtime proof that exercises an unavailable row with omitted usage and shows retained bars plus the limit note.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (9 earlier review cycles; latest 8 shown)
  • reviewed 2026-08-19T22:07:30.093Z sha d994ed1 :: needs real behavior proof before merge. :: [P2] Drop expired windows from retained snapshots
  • reviewed 2026-08-19T22:35:23.570Z sha 97030f1 :: needs real behavior proof before merge. :: [P2] Filter expired windows from retained snapshots
  • reviewed 2026-08-19T23:29:52.127Z sha 0e4c0f4 :: needs real behavior proof before merge. :: [P2] Retain at-limit state for CLI projections
  • reviewed 2026-08-19T23:51:20.645Z sha 0e4c0f4 :: needs real behavior proof before merge. :: [P2] Preserve retained state in CLI projections
  • reviewed 2026-08-20T00:50:52.500Z sha 18d66cc :: needs real behavior proof before merge. :: [P2] Bind retained usage to the source account
  • reviewed 2026-08-20T02:37:14.566Z sha 38882c3 :: needs real behavior proof before merge. :: [P2] Prune directly supplied unavailable windows
  • reviewed 2026-08-20T03:33:29.762Z sha e0e8c48 :: needs real behavior proof before merge. :: [P2] Drop unknown-reset windows during retained fallback | [P2] Avoid persisting a deterministic email fingerprint
  • reviewed 2026-08-20T04:37:11.064Z sha b249e87 :: needs real behavior proof before merge. :: [P2] Avoid persisting a deterministic email fingerprint

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d994ed18dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Aug 19, 2026

@steipete steipete left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The direction is right (an at-limit deferral is current truth, not a stale fetch failure), but the PR's own test fails on its own head, before any interaction with main:

✘ "unavailable refresh retains previous at limit snapshot"
   account.snapshot?.primary?.usedPercent → nil, expected 100
   account.snapshot?.secondary?.usedPercent → nil, expected 100
   account.snapshot?.updatedAt → nil, expected now
   error → "Polling deferred until a limit resets." (expected to name the exhausted windows)

Reproduced locally at d994ed1 with swift test --filter ClaudeProviderRuntimeTests. The projection returns no snapshot for the usageStatus: "unavailable" + usage: null row in the runtime path, so the retained-snapshot behavior the PR describes isn't reaching account.snapshot — only the projection-level unit tests pass. Looks like the runtime refresh path (UsageStore+ClaudeSwapRefresh) still drops the row before your retention logic runs.

I've merged current main into the branch (pushed) so you're up to date. Once the runtime path retains the snapshot and the suite is green on your side, ping me and I'll land it — #3082 (alias disambiguation) can go in the same pass since it's stacked on the same area.

Keeping the whole previous snapshot after any sibling reset still showed
"Resets now" on lanes that had already recovered.

Co-authored-by: Cursor <cursoragent@cursor.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0e4c0f4162

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Aug 19, 2026
One-shot cards and dashboard now reuse the last slot windows so an
unavailable cswap row with null usage keeps the exhausted bars.

Co-authored-by: Cursor <cursoragent@cursor.com>
@sf-jin-ku

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Aug 20, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event exact_review_queue).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 18d66cc92c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

A SHA-256 fingerprint in the retained-usage cache rejects leftover 100% bars after the same slot is reused by a different account.

Co-authored-by: Cursor <cursoragent@cursor.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 38882c3248

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Direct cswap unavailable payloads with mixed reset times now drop already-reset lanes the same way retained snapshots do.

Co-authored-by: Cursor <cursoragent@cursor.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 425da0b7ce

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/CodexBar/Providers/Claude/UsageStore+ClaudeSwapRefresh.swift Outdated
sf-jin-ku and others added 2 commits August 19, 2026 20:12
Seed the app projection from the retained-usage cache after a relaunch, and render dashboard windows alongside the deferred/limit note instead of returning after the error.

Co-authored-by: Cursor <cursoragent@cursor.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 25b06a8c6c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 87a909112b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/CodexBar/Providers/Claude/UsageStore+ClaudeSwapRefresh.swift Outdated
Slot-only fingerprints reused bars after an email-less account was replaced. Decline persistence and reuse unless the row has an email, and move the changelog note to 0.54.1 Unreleased.

Co-authored-by: Cursor <cursoragent@cursor.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1f60407982

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Stale claude-swap refreshes were writing the on-disk cache before the generation guard, and 100% windows without a future reset were kept forever.

Co-authored-by: Cursor <cursoragent@cursor.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e0e8c48321

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@clawsweeper clawsweeper Bot added the merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. label Aug 20, 2026
sf-jin-ku and others added 2 commits August 19, 2026 21:29
…tails

SwiftFormat rejected the nested guard wrap, and OpenRouter detail titles now follow the steipete#3084 localization pass.

Co-authored-by: Cursor <cursoragent@cursor.com>
A non-exhausted session lane with no resetsAt was kept beside a weekly at-limit bar and re-saved until that weekly reset, so a five-hour value could linger for days.

Co-authored-by: Cursor <cursoragent@cursor.com>
@sf-jin-ku

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Aug 20, 2026

Copy link
Copy Markdown

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event exact_review_queue).
Result: when the review finishes, ClawSweeper will create the durable review comment if needed or update the existing comment in place.

@steipete
steipete merged commit 6ed9d98 into steipete:main Aug 20, 2026
9 checks passed
steipete added a commit that referenced this pull request Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P2 Normal priority bug or improvement with limited blast radius. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants